Drone CI

前陣子花了一段時間 survey 一些 CI 的東西,從最一開始知道說有 Travis CI 以及 Drone.io。

但是這兩種屬於網頁服務,所以在語言的選擇上有些限制,以及對 Private Repo 的價格都不便宜。

於是將目光轉向一些可以自己架設的 CI Server,且 Server 如果是自己架設的話,可以建立一個比較接近開發時的測試環境。如:

  • Jenkins
  • Strider
  • Drone

首先嘗試的 Jenkins 老爹,但是有點被那眾多的 plugin 以及設定嚇到(加上老大似乎不喜歡)。

第二個嘗試的是 Drone,但是兩次都因為設定沒設完,首頁只會把你導引到如何設定的說明頁

最後是 Strider,第一眼的觀感良好,實際在玩的時候也是一堆坑 XD。


Install & Run

講到安裝的話,可以先參考這兩篇:

由於在玩 Strider 的時候被 Docker 操了一下,所以大概知道有些大大已經 Dockerhub 放上了他們的心血結晶。

我們的任務就把它找出來,心存感謝的使用(如果他有好好寫說明以及 Dockerfile 的話)。

Dokcerfilelink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM mattgruter/doubledocker

MAINTAINER Matthias Grüter <matthias@grueter.name>

RUN apt-get -y install htop
RUN apt-get -y install wget
RUN wget http://downloads.drone.io/master/drone.deb
RUN dpkg -i drone.deb

EXPOSE 80

VOLUME /var/lib/drone

ENV DRONE_SERVER_PORT :80
ENV DRONE_DATABASE_DATASOURCE /var/lib/drone/drone.sqlite

CMD /etc/init.d/docker start && /usr/local/bin/droned

Dockerfile 弱弱解說

Port

ENV DRONE_SERVER_PORT :80 設定環境變數,讓 Drone 在 port 80 開啟。

EXPOSE 80 這個 container 會把 port 80 導出來。

因此 docker run 可以用 -p 8080:80 將 container 的 port 80 導到 外面的port 8080。

Volume

sqlite

ENV DRONE_DATABASE_DATASOURCE /var/lib/drone/drone.sqlite container 會把資料庫放在 /var/lib/drone/drone.sqlite

我們可以在 host 準備一個資料給 container 放。

例如我們打算提供 ~/drone.sqlite 給 container,touch ~/drone.sqlite

因此 docker run 可以用 -v ~/drone.sqlite:/var/lib/drone/drone.sqlite,把 host 的 ~/drone.sqlite 給 container 當 /var/lib/drone/drone.sqlite 用。

mattgruter/dronelink
1
2
3
4
5
6
7
8
9
10
docker pull mattgruter/drone

docker run -e DRONE_GITHUB_CLIENT="..." \
-e DRONE_GITHUB_SECRET="..." \
-p 8080:80 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/drone.sqlite:/var/lib/drone/drone.sqlite \
--privileged \
mattgruter/drone
# Drone run at http://localhost:8080

Drone 的相關環境變數設定可以參考Drone Setup

DRONE_GITHUB_CLIENT & DRONE_GITHUB_SECRET 這兩個參數必須到 Github 領取

設定方式可以參考Setting Github

Github 的設定頁 -> Applications -> Register new application

Example:

可以在Drone Setup看到 DRONE_BITBUCKET_CLIENT & DRONE_BITBUCKET_SECRET 這兩個環境變數

設定方式一樣可以參考Setting Bitbucket

Bitbucket 首頁 -> Manage Account -> Oauth -> Add consumer

Example:


github 上提到的設定

[registration]
open=true

以及

環境變數 export DRONE_REGISTRATION_OPEN=false

似乎在alpha版是個假像


真正有作用的反而在 Drone Readme
[bitbucket]
open = false
[github]
open = true

以及環境變數
DRONE_BITBUCKET_OPEN
DRONE_GITHUB_OPEN

至於這個變數幹嘛用的,遇到就知道了(誤)

使用心得

使用 Drone 的話,必須編寫 .drone.yml,如果之前有玩過 Travis 話,會感覺一些些熟悉。

.travis.yml 會在首行指定語言。

.travis.yml
1
2
3
language: android
jdk: oraclejdk7
#...

.drone.yml 在首行指定 Docker Image!!!! 一整個只有驚喜啊 :)

.drone.yml
1
2
image: python2.6
#...

.drone.yml 的語法可以參考

Other Ref: